package co.kr.bymin76.controller;

import java.util.ArrayList;



public class CalculatorController {

	//결과 값
	public String result;
	// 넘어온 계산식
	public String formula;
	// 계산식 배열
	public ArrayList<String> valueArray = new ArrayList<String>();

	
	private final String TYPE_MULTIPLICATION = "×";
	private final String TYPE_DIVSION = "÷";
	private final String TYPE_ADDITION = "+";
	private final String TYPE_SUBTRACTION = "-";
	
	
	public CalculatorController() {
		
	}
	
	/**
	 * 계산된 결과 얻기 (String)
	 * @return String
	 */
	
	public String getResult() {

		//실수형의 문자값이 반환 되므로 소수점이하  값  판단
		result = valueArray.get(0);
		int pointIndex = result.indexOf(".");
		if (pointIndex >= 0 ) {
			Double pointBackNumber = Double.parseDouble(result.substring(pointIndex+1,result.length()));
			String front = result.substring(0,pointIndex);
			
			if ( pointBackNumber == 0.0 ) {
				result = front ;
			}
		}
		return result;
	}

	/**
	 * 계산식 넘기기 (String)
	 * @param formula
	 */
	public void setFormula(String formula) {
		this.formula = formula;

		if ( formula != "0" && formula.length() > 0 ){
			//계산식 배열 초기화
			valueArray = new ArrayList<String>();
	
			//배열 저장 결과 판단
			boolean resultType = new Boolean(false);
			
			//배열에 저장
			resultType = setArray(formula);
			
			if (resultType == true){
				sum();
			}
		}
	}
	
	/**
	 * 계산식 배열에 저장
	 */
	public boolean setArray(String formula){
		//전체 계산식
		Integer leng = new Integer(formula.length());
		//
		Integer strPos = new Integer(0);
		// 비교할  한 문자
		String tempChr = new String();

		for (int i = 0; i < leng+1; i++) {

			//마지막 숫자 체크 (마지막에는 기호가 없음)
			if ( i < leng ) {
				tempChr = formula.substring(i, i+1);
				//문자를 순차적으로 비교해 기호가 나오면 앞쪽 숫자와 기호를 배열에 저장
				if ( tempChr.equals(TYPE_SUBTRACTION) || tempChr.equals(TYPE_ADDITION) || tempChr.equals(TYPE_DIVSION) || tempChr.equals(TYPE_MULTIPLICATION)){
					//숫자 저장
					valueArray.add( formula.substring(strPos, i));
					
					//기호 저장
					valueArray.add( formula.substring(i, i+1));
					strPos = i+1;
				}
			}else{
				//마지막 숫자 저장
				valueArray.add(formula.substring(strPos, i));
			}
		}
		return true;
	}
	
	/**
	 * 배열에 저장된 수식 계산
	 * @return
	 */
	public boolean sum(){

		double before = 0 ;
		double after = 0 ;
		double result = 0 ;
		//삭제될  위치 인덱스
		int deleteIndex = 0;
		
		while ( valueArray.size() > 1) {

			// 곱하기

			int mIndex = valueArray.indexOf(TYPE_MULTIPLICATION);
			int dIndex = valueArray.indexOf(TYPE_DIVSION);
			int aIndex = valueArray.indexOf(TYPE_ADDITION);
			int sIndex = valueArray.indexOf(TYPE_SUBTRACTION);
			
			if ( mIndex > -1){											//곱하기
				//곱하기 표시의 전후 값을 읽어 계산을 한다.
				before = Double.parseDouble(valueArray.get(mIndex-1));
				after = Double.parseDouble(valueArray.get(mIndex+1));
				result = auction(before, after, TYPE_MULTIPLICATION);

				deleteIndex = mIndex;

			}else if( dIndex > -1 && mIndex == -1 ){						// 나누기
				before = Double.parseDouble(valueArray.get(dIndex-1));
				after = Double.parseDouble(valueArray.get(dIndex+1));
				result = auction(before, after, TYPE_DIVSION);
				
				deleteIndex = dIndex;
				
			}else if ( aIndex > -1 && mIndex == -1   && dIndex == -1){		//더하기
				before = Double.parseDouble(valueArray.get(aIndex-1));
				after = Double.parseDouble(valueArray.get(aIndex+1));
				result = auction(before, after, TYPE_ADDITION);
				
				deleteIndex = aIndex;
				
			}else if ( sIndex > -1 && mIndex == -1   && dIndex == -1 && aIndex == -1 ){		//빼기;
				before = Double.parseDouble(valueArray.get(sIndex-1));
				after = Double.parseDouble(valueArray.get(sIndex+1));
				result = auction(before, after, TYPE_SUBTRACTION);
				
				deleteIndex = sIndex;
			}
			
			// 계산 결과  기호 앞 index에 저장
			valueArray.set(deleteIndex-1, Double.toString(result));
			
			// 계산 완료 후 삭제
			//뒤 값 삭제
			valueArray.remove(deleteIndex+1);
			//기호 삭제
			valueArray.remove(deleteIndex);
			
		}
		return true;
	}
	
	/**
	 * 곱하기 계산
	 * @param b
	 * @param a
	 * @return
	 */
	private double auction(Double b, Double a, String type) {
		double result = 0;
		
		if ( type.equals(TYPE_MULTIPLICATION))
			result = b * a ;
		else if ( type.equals(TYPE_DIVSION))
			result = b / a ;
		else if ( type.equals(TYPE_ADDITION))
			result = b + a ;
		else if ( type.equals(TYPE_SUBTRACTION))
			result = b - a ;

		return result;
	}
	

	
	public ArrayList<String> getValueArray() {
		return valueArray;
	}

	public void setValueArray(ArrayList<String> valueArray) {
		this.valueArray = valueArray;
	}
	
}
